/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.servicios.externos;

import com.ec.socialfun.entidades.Usuario;
import com.ec.socialfun.enumeradores.ParametrosEnum;
import com.ec.socialfun.excepciones.ParametroException;
import com.ec.socialfun.excepciones.QRCodeException;
import com.ec.socialfun.servicios.ParametrosFacade;
import com.ec.socialfun.servicios.UsuarioFacade;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import net.glxn.qrgen.QRCode;
import net.glxn.qrgen.image.ImageType;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRGraphics2DExporter;
import net.sf.jasperreports.engine.export.JRGraphics2DExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.jboss.logging.Logger;

/**
 *
 * @author jorge
 */
@Stateless
public class QRCodeServicio {

    private static final Logger LOG = Logger.getLogger(QRCodeServicio.class.getName());
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @EJB
    private UsuarioFacade usuarioFacade;
    @EJB
    private ParametrosFacade parametroFacade;

    public ByteArrayOutputStream crearQRCodeDeUsuario(String key) throws QRCodeException {
        try {

            return QRCode.from(key).to(ImageType.JPG).stream();
        } catch (Exception e) {
            LOG.error("Error al crear QRCode del usuario " + e);
            throw new QRCodeException("Error al crear QRCode del usuario");
        }
    }

    public File generarTarjetaVirtual(String mailUsuario) throws QRCodeException {
        try {
            Usuario usuario = usuarioFacade.recuperaUsuarioPorMail(mailUsuario);
            String carpetaTemporal = parametroFacade.recuperaPorNombre(ParametrosEnum.CARPETA_TEMPORAL.getNombre()).getPaValor();
            String logoTarjeta = parametroFacade.recuperaPorNombre(ParametrosEnum.DIRECCION_LOGO_TARJETA.getNombre()).getPaValor();
            
            
            ByteArrayOutputStream outputStraeam = crearQRCodeDeUsuario(usuario.getUsKey());
            Image imagen = new ImageIcon(outputStraeam.toByteArray()).getImage();
            Map<String, Object> param = new HashMap<String, Object>();
            param.put("photo", imagen);
            param.put("nombreUsuario", usuario.getUsNombre());
            param.put("apellidoUsuario", usuario.getUsPrimerApellido());
            param.put("direccionLogoTarjeta", logoTarjeta);
            List listaPorDefecto = new ArrayList();
            listaPorDefecto.add(null);

            InputStream archivoJasper = getClass().getResourceAsStream("tarjetaVirtual.jasper");
            LOG.info("archivoJasper existe " + archivoJasper.available());
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(archivoJasper);

            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, param, new JRBeanCollectionDataSource(listaPorDefecto));

            File archivoTemporal = new File(carpetaTemporal + usuario.getUsCodigo() + ".jpg");
            int pageIndex = 0;
            BufferedImage pageImage = new BufferedImage(jasperPrint.getPageWidth() + 1, jasperPrint.getPageHeight() + 1, BufferedImage.TYPE_INT_RGB);
            JRGraphics2DExporter exporter = new JRGraphics2DExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRGraphics2DExporterParameter.GRAPHICS_2D, pageImage.getGraphics());
            exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex));
            exporter.exportReport();
            ImageIO.write(pageImage, "jpeg", archivoTemporal);
            return archivoTemporal;
        } catch (ParametroException e) {
            LOG.error("Error al recuperar parametros para generar tarjeta virtual " + e);
            throw new QRCodeException("Error al recuperar parametros para generar tarjeta virtual");
        } catch(JRException e){
            LOG.error("Error al leer JasperReport " + e);
            throw new QRCodeException("Error al leer JasperReport");
        }catch(IOException e){
            LOG.error("Error al crear archivo JasperReport " + e);
            throw new QRCodeException("Error al crear archivo JasperReport");
        }

    }
}
